package link;


import org.junit.Test;

//双向链表
public class DoubleLinkedList {


    @Test
    public  void test(){
        //创建一个单链表
        DoubleSingLinkList list = new DoubleSingLinkList(); //已经加载了头节点
        //创建英雄节点
        HeroNodeT hero1 = new HeroNodeT(1, "宋江", "及时雨");
        HeroNodeT hero2 = new HeroNodeT(2, "卢俊义", "玉麒麟");
        HeroNodeT hero3 = new HeroNodeT(3, "吴用", "智多星");
        HeroNodeT hero4 = new HeroNodeT(4, "林冲", "豹子头");
        HeroNodeT hero5 = new HeroNodeT(5, "玛丽亚", "***");
        list.add(hero1);
        list.add(hero2);
        list.add(hero3);
        list.add(hero4);
        list.add(hero5);
        System.out.println("修改前：");
        list.show();
        System.out.println("修改后：");
        list.update(new HeroNodeT(3, "玛丽亚","杰克森"));
        list.saveOrUpdate(new HeroNodeT(6, "强生","泰坦"));
        list.show();
        System.out.println("删除后:");
        list.delete(2);
        list.show();
    }
}
//定义一个双向链表
class DoubleSingLinkList {
    //定义一个头节点   方便找到初始位置
    HeroNodeT headNode = new HeroNodeT(); //头节点 里面不要任何的数据 单纯的定位

    public HeroNodeT getHeadNode() {
        return headNode;
    }
    //todo 按照顺序添加
    public void addOrderBy(){

    }

    //删除方法
    public void delete(int no){
        HeroNodeT t=getHeadNode();
        while ((t=t.next)!=null){
            if(t.no==no){
              //找到要删除的节点
                t.pre.next=t.next;  //当前节点 t-1 -> t+1
                t.next.pre=t.pre.pre;// t+1 -> t-1
                return;
            }
        }
        System.out.println("没有找到no:"+no);
    }

    //修改节点  跟单链表一样
    public void update(HeroNodeT nodeT){
        HeroNodeT t=getHeadNode();
        while ((t=t.next)!=null){
          if(t.no==nodeT.no){
              t.name= nodeT.name;
              t.nickName= nodeT.nickName;
              System.out.println(nodeT.no+"修改成功");
              return;
          }
        }
        System.out.println("没有找到no:"+nodeT.no);
    }
    //修改节点  跟单链表一样
    public void saveOrUpdate(HeroNodeT nodeT){
        HeroNodeT t=getHeadNode();
        while ((t=t.next)!=null){
            if(t.no==nodeT.no){
                t.name= nodeT.name;
                t.nickName= nodeT.nickName;
                System.out.println(nodeT.no+"修改成功");
                return;
            }
        }
        System.out.println("没有找到no,正在添加"+nodeT.no);
        add(nodeT);
    }

    //添加节点  默认添加到最后
    public void add(HeroNodeT nodeT) {
        //首先要找到最后一个节点  如果最后一个节点.next==null  那么这个就是最后节点
        HeroNodeT temp = headNode; //定义一个辅助遍历，因为头节点不能动，类似于指针
        while (true) {
            if (temp.next == null) {  //找到最后节点
                break;
            }
            temp = temp.next; //依次往后遍历
        }
        temp.next=nodeT;
        nodeT.pre=temp;
    }

    //遍历所有节点
    public void show() {
        if (headNode.next == null) {
            System.out.println("空数据~~~~~");
            return;
        }
        HeroNodeT temp = headNode; //定义一个辅助遍历，因为头节点不能动，类似于指针
        while ((temp = temp.next) != null) {
            System.out.println(temp.toString());
        }
    }


}

//定义一个英雄节点
class HeroNodeT {
   public int no;
    public String name;
    public String nickName; //昵称
    public HeroNodeT next;  //默认是null
    public HeroNodeT pre;  //默认是null

    public HeroNodeT() {
    }

    public HeroNodeT(int no, String name, String nickName) {
        this.no = no;
        this.name = name;
        this.nickName = nickName;
    }

    @Override
    public String toString() {
        return "HeroNodeT{" + "no=" + no + ", name='" + name + '\'' + ", nickName='" + nickName + "}'";
    }
}
